乐筑天下

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

[编程交流] 曲线之间的交点

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:29:53 | 显示全部楼层 |阅读模式
大家好,
我刚刚探索了vlax曲线-***函数,出现了一个问题:
有可能找到两条曲线之间的交点吗?
182954i1yv8hisqir1clyk.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:41:53 | 显示全部楼层
为什么不是VLAX-INTERSECTWITH
 
  1. (setq intpt2 (vlax-invoke obj3 'intersectWith obj1 acExtendThisEntity))
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:43:12 | 显示全部楼层
谢谢你,比格尔!
看起来比我想象的要容易。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:52:08 | 显示全部楼层
不用担心,有4个条件你可以使用扩展是1可以使用1 2 3 4而不是长acex。。。。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:59:27 | 显示全部楼层
我在代码方面取得了一些进展:
182956xvrwwwwnrkg6jwoj.jpg
  1. [b][color=BLACK]([/color][/b]defun c:test [b][color=FUCHSIA]([/color][/b] / ent1 ent2 obj1 obj2 int-lst cnt pt pt-lst [b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]vl-load-com[b][color=FUCHSIA])[/color][/b]
  3. [b][color=FUCHSIA]([/color][/b]setvar 'errno 0[b][color=FUCHSIA])[/color][/b]
  4. [b][color=FUCHSIA]([/color][/b]while
  5.         [b][color=NAVY]([/color][/b]not
  6.                 [b][color=MAROON]([/color][/b]and
  7.                         [b][color=GREEN]([/color][/b]setq ent1 [b][color=BLUE]([/color][/b]car [b][color=RED]([/color][/b]entsel [color=#2f4f4f]"\nPick first curve: "[/color][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  8.                         [b][color=GREEN]([/color][/b]setq obj1 [b][color=BLUE]([/color][/b]vlax-ename->vla-object ent1[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  9.                 [b][color=MAROON])[/color][/b]
  10.         [b][color=NAVY])[/color][/b]
  11.         [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]or [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]getvar 'errno[b][color=BLUE])[/color][/b] 7[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]null ent1[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\nYou missed, try again!"[/color][b][color=MAROON])[/color][/b] [b][color=NAVY])[/color][/b]
  12. [b][color=FUCHSIA])[/color][/b]
  13. [b][color=FUCHSIA]([/color][/b]while
  14.         [b][color=NAVY]([/color][/b]not
  15.                 [b][color=MAROON]([/color][/b]and
  16.                         [b][color=GREEN]([/color][/b]setq ent2 [b][color=BLUE]([/color][/b]car [b][color=RED]([/color][/b]entsel [color=#2f4f4f]"\nPick second curve: "[/color][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  17.                         [b][color=GREEN]([/color][/b]setq obj2 [b][color=BLUE]([/color][/b]vlax-ename->vla-object ent2[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  18.                         [b][color=GREEN]([/color][/b]not [b][color=BLUE]([/color][/b]eq ent1 ent2[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  19.                 [b][color=MAROON])[/color][/b]
  20.         [b][color=NAVY])[/color][/b]
  21.         [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]or [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]getvar 'errno[b][color=BLUE])[/color][/b] 7[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]null ent2[b][color=GREEN])[/color][/b] [b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\nYou missed, try again!"[/color][b][color=MAROON])[/color][/b] [b][color=NAVY])[/color][/b]
  22. [b][color=FUCHSIA])[/color][/b]
  23. [b][color=FUCHSIA]([/color][/b]setq int-lst [b][color=NAVY]([/color][/b]vlax-safearray->list [b][color=MAROON]([/color][/b]vlax-variant-value [b][color=GREEN]([/color][/b]vla-IntersectWith obj1 obj2 acExtendNone[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  24. [b][color=FUCHSIA]([/color][/b]setq cnt [b][color=NAVY]([/color][/b]- 1[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  25. [b][color=FUCHSIA]([/color][/b]foreach x int-lst
  26.         [b][color=NAVY]([/color][/b]if
  27.                 [b][color=MAROON]([/color][/b]and
  28.                         [b][color=GREEN]([/color][/b]setq pt [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]nth [b][color=PURPLE]([/color][/b]setq cnt [b][color=TEAL]([/color][/b]+ cnt 1[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] int-lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b]nth [b][color=PURPLE]([/color][/b]setq cnt [b][color=TEAL]([/color][/b]+ cnt 1[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] int-lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b]nth [b][color=PURPLE]([/color][/b]setq cnt [b][color=TEAL]([/color][/b]+ cnt 1[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] int-lst[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  29.                         [b][color=GREEN]([/color][/b]car pt[b][color=GREEN])[/color][/b] [color=#8b4513]; X check[/color]
  30.                         [b][color=GREEN]([/color][/b]cadr pt[b][color=GREEN])[/color][/b] [color=#8b4513]; Y check[/color]
  31.                         [b][color=GREEN]([/color][/b]caddr pt[b][color=GREEN])[/color][/b] [color=#8b4513]; Z check[/color]
  32.                 [b][color=MAROON])[/color][/b]
  33.                 [b][color=MAROON]([/color][/b]setq pt-lst [b][color=GREEN]([/color][/b]cons pt pt-lst[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  34.         [b][color=NAVY])[/color][/b]
  35. [b][color=FUCHSIA])[/color][/b]
  36. [b][color=FUCHSIA]([/color][/b]setq pt-lst [b][color=NAVY]([/color][/b]reverse pt-lst[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  37. [b][color=FUCHSIA]([/color][/b]progn
  38.         [b][color=NAVY]([/color][/b]setvar 'PDMODE 35[b][color=NAVY])[/color][/b]
  39.         [b][color=NAVY]([/color][/b]foreach x pt-lst
  40.                 [b][color=MAROON]([/color][/b]if x
  41.                         [b][color=GREEN]([/color][/b]progn
  42.                                 [b][color=BLUE]([/color][/b]entmakex [b][color=RED]([/color][/b]list [b][color=PURPLE]([/color][/b]cons 0 [color=#2f4f4f]"POINT"[/color][b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]cons 10 x[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]cons 62 1[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
  43.                                 [b][color=BLUE]([/color][/b]princ [color=#2f4f4f]"\n"[/color][b][color=BLUE])[/color][/b][b][color=BLUE]([/color][/b]print x[b][color=BLUE])[/color][/b]
  44.                         [b][color=GREEN])[/color][/b]
  45.                 [b][color=MAROON])[/color][/b]
  46.                
  47.         [b][color=NAVY])[/color][/b]
  48. [b][color=FUCHSIA])[/color][/b]
  49. [b][color=FUCHSIA]([/color][/b]princ[b][color=FUCHSIA])[/color][/b]
  50. [b][color=BLACK])[/color][/b][color=#8b4513];defun        [/color]

我不确定我的方法是否草率。
我要考虑的下一步是使用选择集:
-SSGET(cons 0“圆、弧、*线*)
-通过选择集迭代并对每个实体使用置换,直到找到所有交点
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:01:47 | 显示全部楼层
下面是下一个版本(在我脑海中):
  1. ; Prompts for a SS (either implied or user) until theres one:
  2. (defun C:test ( / SS SSloop lst assoc-lst cnt )
  3. (setq SSloop T)
  4. (while SSloop
  5.         (if (not (setq SS (ssget "_I")))
  6.                         (setq SS (ssget "_:L"))
  7.                         (sssetfirst nil nil)
  8.         )
  9.         (if (and SS (>= (sslength SS) 1))
  10.                 (progn
  11.                         (setq lst (ss->lst SS))
  12.                         (setq assoc-lst (combine-itms lst))
  13.                         (print assoc-lst)
  14.                         (setq cnt 0)
  15.                         (repeat (length assoc-lst)
  16.                                 (ins-pt (car (nth cnt assoc-lst)) (cdr (nth cnt assoc-lst)) )
  17.                                 (setq cnt (+ cnt 1))
  18.                         )
  19.                         (setq SSloop nil)
  20.                 )
  21.         )
  22. )
  23. (princ)
  24. )
  25. (defun ss->lst (ss / i l)
  26. (if (eq (type ss) 'pickset)
  27.         (repeat (setq i (sslength ss))
  28.         (setq l (cons (ssname ss (setq i (1- i))) l))
  29.         )
  30. )
  31. )
  32. ; So this is the source list: A B C D
  33. ; The result should be like this: (("A" . "B") ("A" . "C") ("A" . "D") ("B" . "C") ("B" . "D") ("C" . "D"))
  34. ; So there would be combination between every 2 items
  35. (defun combine-itms ( lst / oldlst newlst cnt itm )
  36. ; (setq lst (list "A" "B" "C" "D"))
  37.         (setq oldlst lst)
  38. (setq newlst (list)) ; the result should be: AB AC AD BC BD CD
  39. (setq cnt 0) ; set a counter
  40. (while (> (length lst) 0) ; repeat until all the items are removed from the list
  41.         (foreach x oldlst ; iterate trough the list
  42.                 (if
  43.                         (and
  44.                                 (not (eq (nth cnt lst) x)) ; check if the current item doesnt duplicate itself (example result would be: AA BB CC DD)
  45.                                 (not (member (cons (nth cnt lst) x) newlst ))
  46.                                 (not (member (cons x (nth cnt lst)) newlst ))
  47.                                 lst ; check if the lst is not nil
  48.                         )
  49.                         (progn
  50.                                 (setq itm
  51.                                         (cons
  52.                                                 (nth cnt lst) ; the current item
  53.                                                 x ; iteration item
  54.                                         )
  55.                                 ) ; combined item
  56.                                 (setq newlst (cons itm newlst)) ; add the combined item in a new list
  57.                                
  58.                         )
  59.                 )
  60.                
  61.         ); foreach
  62.           (setq lst (remove_nth lst cnt)) ; returns the same list without the item on "cnt" position (redefine the list)
  63.         ;(setq cnt (+ cnt 1)) ; increment the counter
  64. ); repeat
  65. (setq newlst (reverse newlst))
  66. ; (print newlst)
  67. ; (princ)
  68. )
  69. ; LM - remove nth (returns the same list with the removed item):
  70. (defun remove_nth ( lst n / lstn )
  71. (setq n (1+ n))
  72. (foreach x lst (if (/= 0 (setq n (1- n))) (setq lstn (cons x lstn))))
  73. (reverse lstn)
  74. )               
  75. (defun ins-pt ( ent1 ent2 / obj1 obj2 int-lst cnt pt pt-lst )
  76.                         ; (setq ent1 (car (entsel "\nPick first curve: ")))
  77.                         (setq obj1 (vlax-ename->vla-object ent1))
  78.                         ; (setq ent2 (car (entsel "\nPick second curve: ")))
  79.                         (setq obj2 (vlax-ename->vla-object ent2))
  80. (setq int-lst (vlax-safearray->list (vlax-variant-value (vla-IntersectWith obj1 obj2 acExtendNone))))
  81. (setq cnt (- 1))
  82. (foreach x int-lst
  83.         (if
  84.                 (and
  85.                         (setq pt (list (nth (setq cnt (+ cnt 1)) int-lst) (nth (setq cnt (+ cnt 1)) int-lst) (nth (setq cnt (+ cnt 1)) int-lst)))
  86.                         (car pt) ; X check
  87.                         (cadr pt) ; Y check
  88.                         (caddr pt) ; Z check
  89.                 )
  90.                 (setq pt-lst (cons pt pt-lst))
  91.         )
  92. )
  93. (setq pt-lst (reverse pt-lst))
  94. (progn
  95.         (setvar 'PDMODE 35)
  96.         (foreach x pt-lst
  97.                 (if x
  98.                         (progn
  99.                                 (entmakex (list (cons 0 "POINT") (cons 10 x) (cons 62 1)))
  100.                                 ; (princ "\n")(print x)
  101.                         )
  102.                 )
  103.                
  104.         )
  105. )
  106. (princ)
  107. );defun       

182957aki3svrldiiiiv59.jpg
我必须自己编写这个“合并itms”子函数。。总的来说,代码非常凌乱,可能可以缩短(也将我以前的代码修改为名为“ins pt”的子函数)。
我所知道的唯一与此类似的代码是CAB的“Break.lsp”,但我没有花时间分析它(只是直接尝试了我的想法)。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:06:24 | 显示全部楼层
尝试将上述表达式用于两个不相交的对象-注意,空safearray的上界为负。
 
以下是两种解决方案:
https://www.theswamp.org/index.php?topic=43461.msg486965#msg486965
 
您可能还会发现这些旧函数很有用:
http://lee-mac.com/intersectionfunctions.html
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:14:39 | 显示全部楼层
 
谢谢李,
我仍然缺乏“安全阵列”的知识(只是无法想象它到底代表了什么)。
我知道你的交集函数,但我尝试“重写”这一函数作为练习。。现在重新检查代码,代码缩短了4-5倍
 
无论如何,我试图创建类似的函数,比如“LM:intersectionsinset”,它将返回一个如下的assoc列表:
((点交点列表)(切线角度列表-第一条inters曲线)(切线角度列表-第二条inters曲线))
这将允许在这些点插入/创建对象,并切换旋转(在第一条曲线或第二条曲线上对齐)。
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 18:19:36 | 显示全部楼层
如附图所示,是否有助于改善相交曲线
测验图纸
182958sib2wenngzixdiis.jpg
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 18:24:55 | 显示全部楼层
到目前为止,没有任何回复,似乎不可能在我的情况下获得交点
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:57 , Processed in 0.899624 second(s), 75 queries .

© 2020-2025 乐筑天下

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