乐筑天下

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

[编程交流] 列表中的3dpolyline

[复制链接]

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:41:49 | 显示全部楼层 |阅读模式
你好,世界!
 
我正在制作一个程序来“收缩包装”用户选择的一组点。它要求2个种子点,并通过距离和角度的组合选择下一个种子点。我会在完成后发布,以防其他人发现它有用。
 
由于我对autolisp编码还不熟悉,所以我有一些小问题。
 
如何将数据输出为当前图层上的多段线?我现在已将其存储为列表。
命令:!点XYZ
((-48.5079 -0.709823 0.0) (-46.3576 4.23851 0.0) (-43.3432 14.1435 0.0)
(-38.6845 11.4073 0.0) (-48.5079 -0.709823 0.0))
 
我可以做entmake,但我该如何指定在当前层上进行呢?
 
 
此外,我还不得不将用户的点选择窗口过滤为仅点。
(设定值(ssget _W))
 
最后,有没有一种简洁的方法来比较检查一个点和另一个点的坐标是否相同?直接比较似乎不起作用,我假设它只比较坐标的引用。
 
非常感谢您的阅读和愉快的编码!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:47:05 | 显示全部楼层
欢迎来到Cadtutor。
 
您可以创建entmake并包含代码以跟随层名称,例如(cons 8“YourLayerName”),或者将所需的层设置为当前层,这将
通常让entmake将实体放置在其上。
 
仅对点进行过滤;
 
  1. (setq pts (ssget '((0 . "POINT"))))

 
当做
 
塔瓦特
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:54:21 | 显示全部楼层
太棒了,谢谢。我没想到,如果没有W,还会提示用户选择窗口。
 
我对entmake的实际工作原理感到非常困惑。为什么
 
工作,但是
不?
 
 
 
另一个令人困惑的地方仍然是,下面的返回为零
(设定点(ssget’((0.“点”)))
(=(entget(ssname点0))(entget(ssname点0)))
 
干杯
做记号
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 09:55:22 | 显示全部楼层
做这样的事情不是更容易吗
 
(setq x(长度ptsxyz))
(setq y 0)
(命令“pline”)
(重复x
(命令(第n个y ptsxyz))
(setq y(+y 1))
)
(命令“”)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 10:01:14 | 显示全部楼层
这就是entmake的使用方式。。
 
  1. (entmake
  2. (list
  3. (cons 0 "LINE")
  4. (cons 10 '(0. 0. 0.))
  5. (cons 11 '(1. 1. 0.))
  6. )
  7. )

 
对于你的第二个困惑,希望这就是你的意思。
 
  1. (setq points (ssget '((0 . "POINT"))))
  2. (= (cdr (assoc 0 (entget (ssname points 0)))) "POINT")

 
当做
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 10:04:02 | 显示全部楼层
 
这个麻烦制造者代码摘录有一些语法错误;请查找以下原始代码的修复程序:
 
  1. (setq x [color=red]'[/color](10 0 0 0))
  2. (entmake
  3. ([color=red]list[/color]
  4. [color=red]'[/color](0 . "LINE")
  5. x
  6. [color=red]'[/color](11 1 1 0)
  7. )
  8. )

 
当做
米尔恰
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 10:07:46 | 显示全部楼层
 
查看用于比较搪瓷的(eq)函数
 
-大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:14:12 | 显示全部楼层
 
你好,马克,
 
这并不是entmake函数行为的不同,而是提供给entmake的list参数是如何计算的。
 
这应该有助于您理解:
http://www.cadtutor.net/forum/showpost.php?p=258390&postcount=20
 
如果你还有问题,请提问。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 10:18:06 | 显示全部楼层
这可能会有帮助。。。
 
  1.   (defun _pline (lst)
  2.    (if (and (> (length lst) 1)
  3.             (entmakex '((0 . "POLYLINE") (10 0. 0. 0.) (70 . ))
  4.             (foreach x lst (entmakex (list '(0 . "VERTEX") (cons 10 x) '(70 . 32))))
  5.        )
  6.      (cdr (assoc 330 (entget (entmakex '((0 . "SEQEND"))))))
  7.    )
  8. )
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 10:23:46 | 显示全部楼层
你们太棒了!这位努力学习Autolisps的新手说,这很有帮助。
 
如果有人感兴趣,下面是我的代码,用于将选定的点连接到一个框中。它找到质心,然后根据上一个点和新点的质心之间的最小角度选择下一个点(使用需要法向量的cal ang)。所以所有的点都需要放置在三维平面上。
 
然后从创建的点列表中生成一条3dpolyline。
 
我可能会修改它,让用户选择几个“质心”,并比较上一个点和最近质心之间的角度,以找到下一个点。只是为了能够处理更尴尬的形状。
 
  1. ;Connects selected points into a box, finds next points by angle from last point to new
  2. ;point through centroid of all points. All points must lay on the same plane in 3d space.
  3. ;Mark Camball, March 2010
  4. (defun c:p2b ();/ points length centroid p list_pt previousp i)
  5. ;;;;;;;;;;;;;;FIND CENTROID OF POINTS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. (defun centroid(sspoints / sumx sumy sumz z)
  7. (setq length (sslength points))
  8. (setq sumx 0 sumy 0 sumz 0 z 0)
  9. (repeat length
  10. (setq sumx (+ sumx (car (cdr (assoc 10 (entget (ssname points z)))))))
  11. (setq sumy (+ sumy (cadr (cdr (assoc 10 (entget (ssname points z)))))))
  12. (setq sumz (+ sumz (caddr (cdr (assoc 10 (entget (ssname points z)))))))
  13. (setq z (+ 1 z))
  14. );_repeat
  15. (setq sumx (/ sumx length) sumy (/ sumy length) sumz (/ sumz length) )
  16. (list sumx sumy sumz)
  17. );_centroid
  18. ;(setq sum '(0,0,0))? and add to list instead of 3 counters?
  19. ;;;;;;;;;;;;;;GET NORMAL VECTOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  20. (defun norm(sspoints / pt1 pt2 pt3)
  21. (setq pt1 (cdr (assoc 10 (entget (ssname points 0)))))
  22. (setq pt2 (cdr (assoc 10 (entget (ssname points 1)))))
  23. (setq pt3 (cdr (assoc 10 (entget (ssname points 2)))))
  24. (cal "nor(pt1,pt2,pt3)")
  25. );_norm
  26. ;error if not all points on same plane or duplicate points chosen
  27. ;;;;;;;;;;;;DETERMINES THE NEXT POINT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  28. (defun nextpoint( / amin n p2 acur pm)
  29. (setq amin 500);loop makes this lower every time a lower value is found
  30. (setq n 0)
  31. (repeat length ;loop through all the points and save the next point to pm
  32.   ;gets the coordinates from the nth point in selection set
  33.   (setq p2 (cdr (assoc 10 (entget (ssname points n)))))
  34.   
  35.   ;if the new point is not same as the last point made
  36.   (if (not (equal previousp p2))  (progn
  37.    ;set angle from lead point to centroid to point in question (3d angle needs normal vector p)
  38.    (setq acur (cal "ang(centroid,previousp,p2,p)"))
  39.    
  40.    ;if the angle is lowest found while looping through all points, make note (pm)
  41.    (if (< acur amin)(progn
  42.     (setq amin acur)
  43.     (setq pm p2)
  44.    ))_if _progn
  45.   ))_if _progn
  46. (setq n (+ 1 n))
  47. );_repeat
  48. (setq pm pm);returns pm
  49. );_nextpoint
  50. ;;;;;;;;;;;;;;;;;;PRINTS THE LIST AS A LINE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. (defun printlist(); / n p1)
  52. ;70.8 for 3d pline 66.1 for verticies follow
  53. ;70.32 ---- use 42.0 instead for pline
  54. ;sets 3dpolyline
  55. ;sets first point
  56. ;repeats the other poionts
  57. ;end polyline
  58. (setq n 0)
  59. (entmake      (list   (cons 0 "POLYLINE")  (cons 66 1) (cons 70   ))
  60. (setq p1 (nth n list_pt))
  61. (entmake (list (cons 0 "VERTEX")(cons 10 p1)(cons 70 32)))
  62. (repeat length
  63. (setq p1 (nth (setq n (+ 1 n)) list_pt))
  64. (entmake (list (cons 0 "VERTEX")(cons 10 p1)(cons 70 32)))
  65. );_repeat
  66. (entmake (list (cons 0 "SEQEND")))
  67. (princ)
  68. );_printlist
  69. ;;;;;;;;;START MAIN PROGRAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  70. ;load in the geometry calculator
  71. (if (not c:cal)(arxload "geomcal"))
  72. ;sets world ucs
  73. (command "ucs" "w")
  74. ;read in all point
  75. (setq points (ssget '((0 . "POINT"))))
  76. (setq length (sslength points))
  77. ;calculate centroif of points
  78. (setq centroid (centroid points))
  79. ;calculate normal vector to points
  80. (setq p (norm points)) ;(only uses 3 points and assumes all are in a plane)
  81. ;create a list to store points in order and sets first point
  82. (setq list_pt (list        (setq previousp (cdr (assoc 10 (entget (ssname points 0)))))    ))
  83. ;each time through (once for every point after first) add one coord to end of list_pt
  84. (setq i 1)
  85. (while (< i length)
  86. (setq list_pt (append list_pt (list (setq previousp (nextpoint)))))
  87. (setq i (+ 1 i))
  88. );_while
  89. ;add first point to end of list to close area
  90. (setq list_pt (append list_pt (list (nth 0 list_pt)) ))
  91. (printlist)
  92. ;(plines)
  93. );_defun
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 00:03 , Processed in 0.382225 second(s), 72 queries .

© 2020-2025 乐筑天下

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