乐筑天下

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

[编程交流] 三维多边形lisp

[复制链接]

28

主题

76

帖子

48

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 12:07:14 | 显示全部楼层 |阅读模式
大家好,
我正在处理三维多段线,我需要一个lisp来完成这项工作:从垂直于三维多段线的一些点绘制直线。有很多点,3d点-我是指空间中的点,Z不同于0。从每个点绘制一条垂直于三维多段线的垂线,但在距离我的点更近的那部分多边形上。有可能吗?谢谢
回复

使用道具 举报

28

主题

76

帖子

48

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 12:11:57 | 显示全部楼层
这是一个示例,但遗憾的是,我没有包含三维多段线的图形,只有二维多段线。原始三维铺层已被展平,是一个管道,无论如何,Z轴上的差异很小。。。
多段线。图纸
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:16:00 | 显示全部楼层
这篇文章探讨了相同的主题。有一些优秀的lisp示例(从第26页开始),它们不需要太多修改就可以完成请求的任务。
 
http://www.cadtutor.net/forum/showthread.php?t=30556
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:18:28 | 显示全部楼层
试试这个:
 
  1. (defun c:perp (/ i ss ent pt p1 p2)
  2. (vl-load-com)
  3. (princ "\n>> Select Points >>")
  4. (if (setq i -1 ss (ssget '((0 . "POINT"))))
  5.    
  6.    (if (and (setq ent (car (entsel "\nSelect Curve: ")))
  7.             (wcmatch (cdr (assoc 0 (entget ent))) "*LINE,CIRCLE,ELLIPSE,ARC"))
  8.        (while (setq pt (ssname ss (setq i (1+ i))))
  9.          (setq p2 (vlax-curve-getClosestPointto ent (setq p1 (cdr (assoc 10 (entget pt))))))
  10.          (entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2))))))
  11. (princ))
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 12:21:15 | 显示全部楼层
 
嘿,我用了一些很类似的东西。
  1. ;;; Draw line perpendicular from selected curve
  2. ;;; Required Subroutines: AT:Entsel
  3. ;;; Alan J. Thompson, 09.29.09
  4. (defun c:LPer (/ *error* #Ent #Obj #Point)
  5. (setq *error* (lambda (x) (and #Obj (vl-catch-all-apply 'vla-highlight (list #Obj :vlax-false)))))
  6. (and
  7.    (setq #Ent (AT:Entsel nil "\nSelect curve: " '((0 . "*POLYLINE,ARC,LINE,CIRCLE,ELLIPSE")) nil))
  8.    (setq #Obj (vlax-ename->vla-object (car #Ent)))
  9.    (not (vla-highlight #Obj :vlax-true))
  10.    (while (setq #Point (getpoint "\nSpecify point for line: "))
  11.      (entmake (list '(0 . "LINE")
  12.                     (cons 10 (vlax-curve-getclosestpointto (car #Ent) (trans #Point 1 0) T))
  13.                     (cons 11 (trans #Point 1 0))
  14.               ) ;_ list
  15.      ) ;_ entmake
  16.    ) ;_ while
  17. ) ;_ and
  18. (*error* nil)
  19. (princ)
  20. ) ;_ defun

 
唯一的问题是,使用3DPolyline时,顶点高程将导致导出最近点。它通常会突然到达终点或其他地方。这真的很烦人。这就是为什么在试图获取三维多段线上的点时,必须使用(osnap(cadr ent)“_near”)而不是(vlax curve getclosestpointto(car ent)(cadr ent))。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:26:03 | 显示全部楼层
快速测试似乎可以,但我并不反对你,因为我在3D世界的经验确实有限眨眼:
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 12:27:37 | 显示全部楼层
它把它们画到了一条线上,它们只是在俯视图中不垂直(根据我的经验,这就是你想要的)。然而,请求方可能只是询问您所做的事情。在处理3D世界时很棘手。我是一个文明的人,所有的东西都是3D的,但不是以一些人在3D中工作的方式。我仍然生活在一个俯瞰世界的地方。
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:29:55 | 显示全部楼层
说到这里,这个怎么样?
 
  1. (defun c:perp (/ i ss ent pt p1 p2)
  2. (vl-load-com)
  3. (princ "\n>> Select Points >>")
  4. (if (setq i -1 ss (ssget '((0 . "POINT"))))
  5.    
  6.    (if (and (setq ent (car (entsel "\nSelect Curve: ")))
  7.             (wcmatch (cdr (assoc 0 (entget ent))) "*LINE,CIRCLE,ELLIPSE,ARC"))
  8.        (while (setq pt (ssname ss (setq i (1+ i))))
  9.          (setq p2 (vlax-curve-getClosestPointtoprojection ent
  10.                     (setq p1 (cdr (assoc 10 (entget pt)))) '(0 0 1)))
  11.          (entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2))))))
  12. (princ))
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 12:35:37 | 显示全部楼层
 
 
干得好,李!
 
我也更新了我的。
 
  1. ;;; Draw line perpendicular from selected curve
  2. ;;; Required Subroutines: AT:Entsel
  3. ;;; Alan J. Thompson, 09.29.09
  4. (defun c:LPer (/ *error* #Ent #Obj #Point)
  5. (setq *error* (lambda (x) (and #Obj (vl-catch-all-apply 'vla-highlight (list #Obj :vlax-false)))))
  6. (and
  7.    (setq #Ent (AT:Entsel nil "\nSelect curve: " '((0 . "*POLYLINE,ARC,LINE,CIRCLE,ELLIPSE")) nil))
  8.    (setq #Obj (vlax-ename->vla-object (car #Ent)))
  9.    (not (vla-highlight #Obj :vlax-true))
  10.    (while (setq #Point (getpoint "\nSpecify point for line: "))
  11.      (entmake (list '(0 . "LINE")
  12.                     (cons 10 (vlax-curve-getclosestpointtoprojection (car #Ent) (trans #Point 1 0) '(0 0 1)))
  13.                     (cons 11 (trans #Point 1 0))
  14.               ) ;_ list
  15.      ) ;_ entmake
  16.    ) ;_ while
  17. ) ;_ and
  18. (*error* nil)
  19. (princ)
  20. ) ;_ defun
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:36:20 | 显示全部楼层
 
谢谢Alan
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

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

© 2020-2025 乐筑天下

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