乐筑天下

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

[编程交流] Autolisp移动函数

[复制链接]

2

主题

16

帖子

14

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 22:12:08 | 显示全部楼层 |阅读模式
我正在尝试编写一个LISP,它将取点1、2和3的Z维度并对其进行平均,然后使用该平均数移动Z轴上的第四个点(几何空间点)。我主要想把Z值为0的几何空间移动到前三个点的平均“Z”的高度。希望这有意义!
 
以下是我到目前为止得到的信息:
 
  1. (defun C:za (/ pt1 pt2 pt3 z1 z2 z3 z4 zdev1 ss x1 y1 pta ptb )
  2. (setq pt1 (getpoint "\n Point 1: "))
  3. (setq pt2 (getpoint "\n Point 2: "))
  4. (setq pt3 (getpoint "\n Point 3: "))
  5. (setq z1 (caddr pt1))
  6. (setq z2 (caddr pt2))
  7. (setq z3 (caddr pt3))
  8. (setq zdev1 (/ (+ z1 z2 z3) 3))
  9. (princ (rtos zdev1 2 2))
  10. (setq ss (ssget "_+.:E:S" '((0 . "AECC_COGO_POINT"))))
  11. (setq pta (getpoint "Basepoint: "))                        ;;Basepoint of forth point      so i can use the X and Y coordinates
  12. (setq x1 (car pt1))
  13. (setq y1 (cadr pt1))
  14. (setq z4 (/ (+ z1 z2 z3) 3))
  15. (setq ptb (x1 y1 zdev1))                                ;;trying to add in the averaged Z to set pt2
  16. (command "move" ss "" pt1 pt2)
  17. (princ)  
  18. )

 
 
请帮忙!
谢谢
约翰
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 22:16:30 | 显示全部楼层
 
  1. (defun C:za (/ pt1 pt2 pt3 z1 z2 z3 z4 zdev1 ss x1 y1 pta ptb )
  2. (setq pt1 (getpoint "\n Point 1: "))
  3. (setq pt2 (getpoint "\n Point 2: "))
  4. (setq pt3 (getpoint "\n Point 3: "))
  5. (setq z1 (caddr pt1))
  6. (setq z2 (caddr pt2))
  7. (setq z3 (caddr pt3))
  8. (setq zdev1 (/ (+ z1 z2 z3) 3))
  9. (princ (rtos zdev1 2 2))
  10. (setq ss (ssget "_+.:E:S" '((0 . "AECC_COGO_POINT"))))
  11. (setq pta (getpoint "Basepoint: "))                       
  12. (setq x1 (car [color="red"]pta[/color]))
  13. (setq y1 (cadr [color="red"]pta[/color]))
  14. [color="gray"];;;  (setq z4 (/ (+ z1 z2 z3) 3))[/color]
  15. (setq ptb ([color="blue"]list[/color] x1 y1 zdev1))                               
  16. (command "move" ss "" [color="red"]pta ptb[/color])
  17. (princ)  
  18. )

对不起,我不太清楚。这是我的理解
1.您只想将坐标几何点移动到平均高程?它的x,y位置不变?只有z?
2.只有单程?
3.基点(第4点)不应移动到第5点?
4.pta=x,y的ptb?差值ptb的z=p1、p2、p3的平均值?
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 22:23:39 | 显示全部楼层
 
尝试一下:
 
  1. (vl-load-com)
  2. (defun c:MoveCogoToAverageElevation (/ *error* osnapz pt1 pt2 pt3 average acDoc)
  3. (defun *error* (msg)
  4.    (and osnapz (setvar 'osnapz osnapz))
  5.    (if acDoc
  6.      (vla-endundomark acDoc)
  7.    )
  8.    (cond ((not msg))                                                   ; Normal exit
  9.          ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
  10.          ((princ (strcat "\n** Error: " msg " ** ")))                  ; Fatal error, display it
  11.    )
  12.    (princ)
  13. )
  14. (if
  15.    (and
  16.      (setq osnapz (getvar 'osnapz))
  17.      (setvar 'osnapz 0)
  18.      (setq pt1 (getpoint "\nSpecify first point: "))
  19.      (not (initget 32))
  20.      (setq pt2 (getpoint pt1 "\nSpecify second point: "))
  21.      (not (initget 32))
  22.      (setq pt3 (getpoint pt2 "\nSpecify tertiary point: "))
  23.      (princ
  24.        (strcat
  25.          "\nSelect COGO points to move to "
  26.          (rtos
  27.            (setq average
  28.                   (/ (apply
  29.                        '+
  30.                        (mapcar (function (lambda (x) (caddr x)))
  31.                                (list pt1 pt2 pt3)
  32.                        )
  33.                      )
  34.                      3
  35.                   )
  36.            )
  37.            2
  38.            2
  39.          )
  40.          " average elevation: "
  41.        )
  42.      )
  43.      (princ)
  44.      (ssget "_:L" '((0 . "AECC_COGO_POINT")))
  45.    )
  46.     (progn
  47.       (vla-startundomark
  48.         (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
  49.       )
  50.       (vlax-for x (vla-get-activeselectionset acDoc)
  51.         (vla-put-elevation x average)
  52.       )
  53.     )
  54. )
  55. (*error* nil)
  56. )
回复

使用道具 举报

2

主题

16

帖子

14

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 22:25:43 | 显示全部楼层
1) 是的
2) 如果你的意思是只选择一个几何空间点,我相信是这样的
3) 第四个点是选择几何空间点的ssget,第五个点是单击几何空间,以便使用其“X”和“Y”坐标
4) 是的
回复

使用道具 举报

2

主题

16

帖子

14

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 22:32:32 | 显示全部楼层
黑匣子,
这太棒了!
谢谢
约翰
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 22:37:05 | 显示全部楼层
 
不客气,约翰;我很乐意帮忙。
 
干杯
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 22:41:59 | 显示全部楼层
 
几何空间点是我们在Civil 3D中使用的东西,它们帮助我们了解地形、识别结构或关键高程,甚至建筑表面。一些属性、方法和事件暴露在LISP中,而另一些则不暴露在LISP中。
 
如果您可以使用Civil 3D进行测试、编码等,并使用LISP进行编码,那么您会发现vlax Dump对象函数非常有用。如果您使用Civil 3D进行制作,并开始深入研究COM/。NET方面(不仅仅是Visual LISP),那么我还建议您将MgdDbg和SnoopC3D插件添加到工具箱中。
 
干杯
回复

使用道具 举报

2

主题

16

帖子

14

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 22:43:17 | 显示全部楼层
黑匣子,
我对autolisp很陌生,我注意到您在为我编写的LISP中使用了“vla”。什么是vla?
 
谢谢
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-5 22:47:16 | 显示全部楼层
 
这是一个复杂的问题。
 
简而言之,LISP通常指提供两种不同的“风格”。。。vanilla LISP(也称为AutoLISP)是AutoCAD附带的原始实现,后来添加了Visual LISP(类似VBA的ActiveX COM API)以扩展功能等。
 
特别是当你是LISP新手时,这个主题可能会让人困惑,但一旦你掌握了其中的概念,通常很容易建立在。。。VL、VLA、VLAX等前缀之间存在差异,David在这里很好地解释了这一点。
 
HTH公司
回复

使用道具 举报

2

主题

16

帖子

14

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 22:51:30 | 显示全部楼层
另外,您提到的两个插件的用途是什么。我使用C3D主要用于调查目的(结构布局、竣工等),它们对我有用吗。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 06:25 , Processed in 0.754330 second(s), 72 queries .

© 2020-2025 乐筑天下

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