乐筑天下

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

[编程交流] “3D”矩形

[复制链接]

20

主题

94

帖子

86

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2022-7-5 16:45:50 | 显示全部楼层 |阅读模式
你好
 
我想在三维实体内制作矩形(或闭合多段线)。
 
现在我使用:
 
Ucs+面+矩形的第一个角点和矩形的第二个角点。
 
我想这样做的Lisp程序。
 
类似于:
 
第一次单击:第一个角点
 
第二次单击:第二个角点
 
绘制一个带有两点的矩形,这意味着矩形的黄色边缘必须平行于z轴。
 
174552ae4p11peyy71yppv.jpg
 
如果有人能帮我,那太好了。
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:01:02 | 显示全部楼层
UCS X 90可能
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:04:10 | 显示全部楼层
尝试:
  1. (defun c:3DRect ( / doc firstP normal pt1 pt2 pt3 pt4)
  2. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  3. (vla-endundomark doc) ; End open undo group.
  4. (vla-startundomark doc)
  5. (if
  6.    (and
  7.      (setq pt1 (getpoint "\nFirst corner: "))
  8.      (setq pt3 (getpoint pt1 "\nOther corner: "))
  9.      (setq normal
  10.        (mapcar '(lambda (a b) (if (equal a b 1e- 1 0)) pt1 pt3)
  11.      )
  12.      (= 1 (apply '+ normal))
  13.    )
  14.    (progn
  15.      (setq pt2
  16.        (mapcar
  17.          '(lambda (n a b)
  18.            (cond ((= 1 n) a) ((setq firstP (not firstP)) a) (b))
  19.          )
  20.          normal
  21.          pt1
  22.          pt3
  23.        )
  24.      )
  25.      (setq pt4
  26.        (mapcar
  27.          '(lambda (n a b)
  28.            (cond ((= 1 n) a) ((setq firstP (not firstP)) a) (b))
  29.          )
  30.          normal
  31.          pt3
  32.          pt1
  33.        )
  34.      )
  35.      (setq normal (trans normal 1 0 T))
  36.      (entmake
  37.        (list
  38.          '(0 . "LWPOLYLINE")
  39.          '(100 . "AcDbEntity")
  40.          '(100 . "AcDbPolyline")
  41.          '(90 . 4)
  42.          (cons 70 (+ 1 (* (getvar 'plinegen) 128)))
  43.          (cons 43 (getvar 'plinewid))
  44.          (cons 38 (caddr (trans pt1 1 normal))) ; Elevation.
  45.          (cons 39 (getvar 'thickness))
  46.          (cons 10 (trans pt1 1 normal))
  47.          (cons 10 (trans pt2 1 normal))
  48.          (cons 10 (trans pt3 1 normal))
  49.          (cons 10 (trans pt4 1 normal))
  50.          (cons 210 normal)
  51.        )
  52.      )
  53.    )
  54. )
  55. (vla-endundomark doc)
  56. (princ)
  57. )
回复

使用道具 举报

20

主题

94

帖子

86

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
90
发表于 2022-7-5 17:13:26 | 显示全部楼层
 
非常感谢,我试过了。它部分起作用。我尝试在很多情况下使用,但有些时间不起作用。
 
附上你可以找到的测试。在三种情况下(红色多段线),此lisp不起作用。也许我犯了一些错误。
测验图纸
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:23:16 | 显示全部楼层
在这里,我纠正了罗伊的代码,虽然有些不同,但逻辑是相同的。。。
 
  1. (defun c:3DRect ( / v^v unit doc normal pt1 pt2 pt3 pt4 )
  2. (vl-load-com)
  3. (defun v^v ( u v )
  4.    (list
  5.      (- (* (cadr u) (caddr v)) (* (caddr u) (cadr v)))
  6.      (- (* (caddr u) (car v)) (* (car u) (caddr v)))
  7.      (- (* (car u) (cadr v)) (* (cadr u) (car v)))
  8.    )
  9. )
  10. (defun unit ( v )
  11.    (if (not (equal v '(0.0 0.0 0.0) 1e-)
  12.      (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  13.    )
  14. )
  15. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  16. (vla-endundomark doc) ; End open undo group.
  17. (vla-startundomark doc)
  18. (if
  19.    (and
  20.      (setq pt1 (trans (getpoint "\nFirst corner : ") 1 0))
  21.      (setq pt3 (trans (getpoint (trans pt1 0 1) "\nOther corner : ") 1 0))
  22.      (setq normal (unit (v^v '(0.0 0.0 1.0) (mapcar '- pt3 pt1))))
  23.    )
  24.    (progn
  25.      (setq pt2 (inters pt1 (mapcar '+ pt1 (v^v normal (append (mapcar '+ '(0.0 0.0) (mapcar '- pt3 pt1)) (list 0.0)))) pt3 (mapcar '+ pt3 (append (mapcar '+ '(0.0 0.0) (mapcar '- pt1 pt3)) (list 0.0))) nil))
  26.      (setq pt4 (inters pt3 (mapcar '+ pt3 (v^v normal (append (mapcar '+ '(0.0 0.0) (mapcar '- pt1 pt3)) (list 0.0)))) pt1 (mapcar '+ pt1 (append (mapcar '+ '(0.0 0.0) (mapcar '- pt3 pt1)) (list 0.0))) nil))
  27.      (entmake
  28.        (list
  29.          '(0 . "LWPOLYLINE")
  30.          '(100 . "AcDbEntity")
  31.          '(100 . "AcDbPolyline")
  32.          '(90 . 4)
  33.          (cons 70 (+ 1 (* (getvar 'plinegen) 128)))
  34.          (cons 43 (getvar 'plinewid))
  35.          (cons 38 (caddr (trans pt1 0 normal))) ; Elevation.
  36.          (cons 39 (getvar 'thickness))
  37.          (cons 10 (trans pt1 0 normal))
  38.          (cons 10 (trans pt2 0 normal))
  39.          (cons 10 (trans pt3 0 normal))
  40.          (cons 10 (trans pt4 0 normal))
  41.          (cons 210 normal)
  42.        )
  43.      )
  44.    )
  45. )
  46. (vla-endundomark doc)
  47. (princ)
  48. )

 
M、 R。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:36:02 | 显示全部楼层
我对这个问题的解释与Marko的不同。我的代码假设矩形必须与当前UCS的X、Y或Z平面平行。Marko的解决方案假设矩形的两侧必须平行于WCS的Z轴。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:40:23 | 显示全部楼层
@马尔科:
为什么不这样计算pt2和pt4
  1. (setq pt2 (list (car pt1) (cadr pt1) (caddr pt3)))
  2. (setq pt4 (list (car pt3) (cadr pt3) (caddr pt1)))
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:46:12 | 显示全部楼层
 
是的,就这么简单。。。我对代码进行了过度编程,但结果是一样的——总是有很多方法可以剥猫的皮。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 14:23 , Processed in 0.756968 second(s), 82 queries .

© 2020-2025 乐筑天下

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