乐筑天下

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

[编程交流] 初学者-跨坐标

[复制链接]

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:28:57 | 显示全部楼层 |阅读模式
大家好,
我用entmake制作了一个lisp来绘制一些东西。这个lisp在世界UCS中工作得很好,我希望这个lisp在任何其他UCS中都能工作。谁来帮帮我?我不知道如何使用trans函数。谢谢
 
  1. (defun c:Test ()
  2. (setq  pt1 (getpoint "\nINSERTION POINT:"))
  3. (setq  pt2 (getpoint pt1 "\nDIRECTION POINT:"))
  4. (entmake '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbPolyline") (90 . 11) (70 . 0) (43 . 0) (38 . 0) (39 . 0) (10 0.000000000007162 30.16249999999849) (40 . 0) (41 . 0) (42 . 0) (10 29.10812500003173 30.16249999999849) (40 . 0) (41 . 0) (42 . 0.414213562373012) (10 46.65000000014153 47.7043749999991) (40 . 0) (41 . 0) (42 . 0) (10 46.65000000014153 50.79999999999684) (40 . 0) (41 . 0) (42 . 0) (10 80.35000000009111 50.79999999999684) (40 . 0) (41 . 0) (42 . 0) (10 80.35000000009111 47.7043749999991) (40 . 0) (41 . 0) (42 . 0.414213562373175) (10 97.89187500020076 30.16249999999849) (40 . 0) (41 . 0) (42 . 0) (10 126.9999999999926 30.16249999999849) (40 . 0) (41 . 0) (42 . 0) (10 126.9999999999926 -30.16249999999168) (40 . 0) (41 . 0) (42 . 0) (10 0.000000000007162 -30.16249999999168) (40 . 0) (41 . 0) (42 . 0) (10 0.000000000007162 30.16249999999849) (40 . 0) (41 . 0) (42 . 0)))
  5. (command "MOVE" "L" "" "0,0,0" PT1)
  6. (command "rotate" "l" "" pt1 pt2)
  7. (princ))
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:40:59 | 显示全部楼层
要使用TRANS调整移动,请执行以下操作:
  1. (command "MOVE" "L" "" [color=magenta](trans '(0 0 0) 0 1)[/color] PT1)

只要UCS不旋转,这将很好地工作-这种情况也需要对旋转角度进行校正。
  1. (command "rotate" "l" "" [color=magenta]pt1 (* (/ (angle (trans pt1 1 0) (trans pt2 1 0)) pi) 180)[/color])
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:57:52 | 显示全部楼层
谢谢,MSasu!
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 08:01:40 | 显示全部楼层
不客气!
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 08:18:04 | 显示全部楼层
我认为这段代码足够了-我删除了重复的顶点11-它与顶点1相同,并启用了闭合LWPOLYLINE选项-它应该适用于任何UCS。。。
 
  1. (defun unit ( v )
  2. (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  3. )
  4. (defun mxv ( m v )
  5. (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  6. )
  7. (defun v^v ( u v )
  8. (list
  9.    (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  10.    (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  11.    (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  12. )
  13. )
  14. (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  15. (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  16. (setq ux (unit (mapcar '- p2 p1)))
  17. (setq uy (unit (mapcar '- p3 p1)))
  18. (mxv (list ux uy uz) (mapcar '- pt p1))
  19. )
  20. (defun entmakelwpoly3dpts ( ptlst aalst opclflag / ux uy uz uptlst )
  21. (setq uz (unit (v^v (mapcar '- (cadr ptlst) (car ptlst)) (mapcar '- (caddr ptlst) (car ptlst)))))
  22. (setq ux (if (equal uz '(0.0 0.0 1.0) 1e- '(1.0 0.0 0.0) (unit (v^v '(0.0 0.0 1.0) uz))))
  23. (setq uy (unit (v^v uz ux)))
  24. (setq uptlst (mapcar '(lambda ( p ) (transptucs p '(0.0 0.0 0.0) ux uy)) ptlst))
  25. (entmake
  26.    (append
  27.      (list
  28.        '(0 . "LWPOLYLINE")
  29.        '(100 . "AcDbEntity")
  30.        '(100 . "AcDbPolyline")
  31.        (cons 90 (length uptlst))
  32.        (cons 70 opclflag)
  33.        (cons 38 (caddar uptlst))
  34.      )
  35.      (apply 'append (mapcar '(lambda (x y) (list (list 10 (car x) (cadr x)) (cons 42 y))) uptlst aalst))
  36.      (list (cons 210 uz))
  37.    )
  38. )
  39. (princ)
  40. )
  41. (defun c:Test ( / pt1 pt2 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 plst alst )
  42. (setq  pt1 (getpoint "\nINSERTION POINT:"))
  43. (setq  pt2 (getpoint pt1 "\nDIRECTION POINT:"))
  44. (setq p1 (list 0.000000000007162 30.16249999999849) p2 (list 29.10812500003173 30.16249999999849) p3 (list 46.65000000014153 47.7043749999991) p4 (list 46.65000000014153 50.79999999999684) p5 (list 80.35000000009111 50.79999999999684) p6 (list 80.35000000009111 47.7043749999991) p7 (list 97.89187500020076 30.16249999999849) p8 (list 126.9999999999926 30.16249999999849) p9 (list 126.9999999999926 -30.16249999999168) p10 (list 0.000000000007162 -30.16249999999168))
  45. (setq a1 0.0 a2 0.414213562373012 a3 0.0 a4 0.0 a5 0.0 a6 0.414213562373175 a7 0.0 a8 0.0 a9 0.0 a10 0.0)
  46. (setq plst (list p1 p2 p3 p4 p5 p6 p7 p8 p9 p10))
  47. (setq alst (list a1 a2 a3 a4 a5 a6 a7 a8 a9 a10))
  48. (setq plst (mapcar '(lambda (x) (trans x 1 0)) plst))
  49. (entmakelwpoly3dpts plst alst 1)
  50. (command "move" "l" "" "0,0,0" pt1)
  51. (command "rotate" "l" "" pt1 pt2)
  52. (princ)
  53. )

 
M、 R。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 08:24:38 | 显示全部楼层
或者,可以通过VLA-OBJECT变换矩阵来实现:
 
  1. (defun unit ( v )
  2. (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  3. )
  4. (defun v^v ( u v )
  5. (list
  6.    (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  7.    (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  8.    (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  9. )
  10. )
  11. (defun WCS->UCS ( ss / xd yd zd o mat n ent entA ) (vl-load-com)
  12. (setq xd (getvar 'ucsxdir))
  13. (setq yd (getvar 'ucsydir))
  14. (setq zd (unit (v^v xd yd)))
  15. (setq o (trans '(0.0 0.0 0.0) 1 0))
  16. (setq mat
  17.    (list
  18.      (list (car xd) (car yd) (car zd) (car o))
  19.      (list (cadr xd) (cadr yd) (cadr zd) (cadr o))
  20.      (list (caddr xd) (caddr yd) (caddr zd) (caddr o))
  21.      (list 0.0 0.0 0.0 1.0)
  22.    )
  23. )
  24. (repeat (setq n (sslength ss))
  25.    (setq ent (ssname ss (setq n (1- n))))
  26.    (setq entA (vlax-ename->vla-object ent))
  27.    (vla-transformby entA (vlax-tmatrix mat))
  28. )
  29. (princ)
  30. )
  31. (defun c:Test ( / pt1 pt2 )
  32. (setq  pt1 (getpoint "\nINSERTION POINT:"))
  33. (setq  pt2 (getpoint pt1 "\nDIRECTION POINT:"))
  34. (entmake '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbPolyline") (90 . 11) (70 . 1) (43 . 0) (38 . 0) (39 . 0) (10 0.000000000007162 30.16249999999849) (40 . 0) (41 . 0) (42 . 0) (10 29.10812500003173 30.16249999999849) (40 . 0) (41 . 0) (42 . 0.414213562373012) (10 46.65000000014153 47.7043749999991) (40 . 0) (41 . 0) (42 . 0) (10 46.65000000014153 50.79999999999684) (40 . 0) (41 . 0) (42 . 0) (10 80.35000000009111 50.79999999999684) (40 . 0) (41 . 0) (42 . 0) (10 80.35000000009111 47.7043749999991) (40 . 0) (41 . 0) (42 . 0.414213562373175) (10 97.89187500020076 30.16249999999849) (40 . 0) (41 . 0) (42 . 0) (10 126.9999999999926 30.16249999999849) (40 . 0) (41 . 0) (42 . 0) (10 126.9999999999926 -30.16249999999168) (40 . 0) (41 . 0) (42 . 0) (10 0.000000000007162 -30.16249999999168) (40 . 0) (41 . 0) (42 . 0)))
  35. (WCS->UCS (ssadd (entlast)))
  36. (command "move" "l" "" "0,0,0" pt1)
  37. (command "rotate" "l" "" pt1 pt2)
  38. (princ)
  39. )

 
M、 R。
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:30:20 | 显示全部楼层
谢谢Marco,太好了!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 05:03 , Processed in 0.719377 second(s), 66 queries .

© 2020-2025 乐筑天下

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